iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0

當我們需要的資料皆分散存在多個資料表中時,我們需要先將這樣資料回傳成一個資料集,如此一來才可以一次檢視所有資料。要達到這個目的我們可以進行合併查詢

首先,我們要知道從不同資料表或資料庫查詢選取資料時,最好每次都要告訴MYSQL我們要使用哪一個資料表或是資料庫,這樣可以提升SQL程式碼的維護性也能避免因為兩個資料欄(表)命名相同而出現錯誤訊息。因此在寫select陳述式時要輸入資料表(庫)名稱、英文句點,再加上資料欄(表)名稱,例如population.country指資料表population的資料欄country。
除了上述的寫法,還可以使用別名,來節省更多時間,例如將p宣告為資料表population的別名,後續就可以直接以p來代替全名。在定義別名時也可以使用關鍵字as,例如population as p。
在使用別名時要特別注意別名只限目前宣告的查詢程式碼!

合併查詢類型

  • 內部合併查詢 (最常使用)
    • 語法:inner join / join
    • 說明:回傳的資料列中的值必定是兩個資料表都有存在的且符合的資料,因此只要有某一欄在某一資料表中不符合條件的話,該值就不會顯示出在結果集
    • 查詢每個員工的部門名稱
      select employees.employee_name,
      departments.department_name,
      from employees
      inner join departments
      on employees.department_id =department.department_id;
      
  • 外部合併查詢
    • 語法:left outer join / left join / right outer join / right join
    • 說明:回傳的資料列其中一個是會顯示資料表中的所有資料欄,而另一個則是會顯示符合條件的資料欄,若是不符合條件的資料欄會顯示null空值,因此不管符不符合條件皆會回傳到結果集中。
    • 左側外部合併查詢:即使右邊的資料欄不符合條件,左側都是會顯示出所有資料欄。若沒有符合條件的,右邊的該資料欄會顯示null
    • 右側外部合併查詢:即使左邊的資料欄不符合條件,右側都是會顯示出所有資料欄。若沒有符合條件的,左邊的該資料欄會顯示null
    • 此表示這將返回所有部門的名字,以及他們的員工。如果某個部門沒有員工,員工名稱將顯示為 null
      select employees.employee_name,
      departments.department_name,
      from employees right outer join departments
      on employees.department_id =department.department_id; 
      
  • 自然合併查詢
    • 語法:natural join
    • 說明:當多個資料表中有名稱相同的資料欄時,會自動合併查詢資料表
    • 很聰明,就算資料表中有相同名稱的資料欄也不會出現重複的值在結果集中
    •  select * ----------------表示選取employees資料表中的所有資料欄
       from employees 
       natural join departments;
      
  • 交叉合併查詢
    • 語法:cross join
    • 說明:回傳結果集為兩資料表的笛卡兒乘積,可以用在排班等排列組合,但要注意會容易造成大量的空間容量
    • 笛卡兒乘積:將第一個表中的每一行與第二個表中的每一行進行配對。如果第一個表有 m 行,第二個表有 n 行,那麼結果集將有 m * n 行。
    • 用在每個學生和每個課程的所有組合
      select student_name, course_name
      from students
      cross join courses; 
      
  • 自身合併查詢
    • 類似於內部合併查詢的概念,但是是一個合併查詢一個資料表而已,也就是說同一資料表名稱列兩次,各自用不同資料表別名去做合併查詢
    • 查詢每個員工及其上司的名稱
       select e1.employee_name as Employee, 
       e2.employee_name as Manager
       from employees e1
       outer join employees e2
       on e1.manager_id = e2.employee_id;
    
    
    

下一章:合併查詢(下)


上一篇
Day3 資料型態
下一篇
Day5 合併查詢(下)
系列文
從零開始的MySQL開發旅程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言